package com.river.springbootdemo.thinkingjava.innerclass;

import com.river.springbootdemo.thinkingjava.innerclass.controller.Controller;
import com.river.springbootdemo.thinkingjava.innerclass.controller.Event;

public class GreenHouseController extends Controller {
    private boolean light = false;

    public class LightOn extends Event {
        public LightOn(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            //put hardware control code here to
            //physically turn on the light
            light = true;
        }

        public String toString() {
            return "light is on";
        }
    }

    public class LightOff extends Event {
        public LightOff(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            //put hardware control code here to
            //physically turn off the light
            light = true;
        }

        public String toString() {
            return "light is off";
        }
    }

    private boolean water = false;

    public class WaterOn extends Event {
        public WaterOn(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            //put hardware control code here to
            light = true;
        }

        public String toString() {
            return "GreenHouse Water is on";
        }
    }

    public class WaterOff extends Event {
        public WaterOff(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            //put hardware control code here to
            light = true;
        }

        public String toString() {
            return "GreenHouse Water is off";
        }
    }

    private String thermostat = "Day";
    public class ThermostatNight extends Event {
        public ThermostatNight(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            //put hardware control code here to
            thermostat = "night";
        }

        public String toString() {
            return "Thermostat on night setting";
        }
    }
    public class ThermostatDay extends Event {
        public ThermostatDay(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            //put hardware control code here to
            thermostat = "Day";
        }

        public String toString() {
            return "Thermostat on day setting";
        }
    }
    //An example of an action() that inserts a new one of itself into the event list:
    public class Bell extends Event {
        public Bell(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            addEvent(new Bell(delayTime));
        }

        public String toString() {
            return "Bing";
        }
    }
    private class Restart extends Event{
        private Event[] eventList;
        public Restart(long delayTime,Event[] eventList){
            super(delayTime);
            this.eventList=eventList;
            for (Event e:eventList){
                addEvent(e);
            }
        }
        @Override
        public void action() {
            for (Event e:eventList){
                e.start();//return each event
                addEvent(e);
            }
            start();//return this event
            addEvent(this);
        }
        public String toString(){return "Restarting system";}
    }

    public class Terminate extends Event {
        public Terminate(long delayTime) {
            super(delayTime);
        }

        @Override
        public void action() {
            System.exit(0);
        }

        public String toString() {
            return "Terminating";
        }
    }
}
